package com.jl.smartcard.core.actions;

import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.SWT;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;

import com.jl.card.Card;
import com.jl.card.CardManager;
import com.jl.card.ISecurityOperation;

/**
 * Our sample action implements workbench action delegate. The action proxy will
 * be created by the workbench and shown in the UI. When the user tries to use
 * the action, this delegate will be created and execution will be delegated to
 * it.
 * 
 * @see IWorkbenchWindowActionDelegate
 */
public class VerifyAction implements IWorkbenchWindowActionDelegate {
	private IWorkbenchWindow window;
	private boolean isCancel;

	/**
	 * The constructor.
	 */
	public VerifyAction() {
	}

	/**
	 * The action has been activated. The argument of the method represents the
	 * 'real' action sitting in the workbench UI.
	 * 
	 * @see IWorkbenchWindowActionDelegate#run
	 */
	@Override
	public void run(IAction action) {
		CardManager mgr = CardManager.getInstance(false);
		String[] allCardsName = CardManager.getAllCardsName();
		Card card = mgr.getLastConnectCard();
		if(card == null){
			return;
		}
		String last = card.getName();
		ISecurityOperation op = card.getProvider().getVerifyDialog(card);
		VerifyDialogUI ui = new VerifyDialogUI(window.getShell(), SWT.NONE);
		ui.setCards(allCardsName);
		ui.selectCard(last);
		ui.setSecurityOperation(op);
		Object res = ui.open();
		if (res != null) {
			if (res.equals(Boolean.FALSE)) {
				this.isCancel = true;
			}
		}
	}

	/**
	 * Selection in the workbench has been changed. We can change the state of
	 * the 'real' action here if we want, but this can only happen after the
	 * delegate has been created.
	 * 
	 * @see IWorkbenchWindowActionDelegate#selectionChanged
	 */
	@Override
	public void selectionChanged(IAction action, ISelection selection) {
	}

	/**
	 * We can use this method to dispose of any system resources we previously
	 * allocated.
	 * 
	 * @see IWorkbenchWindowActionDelegate#dispose
	 */
	@Override
	public void dispose() {
	}

	/**
	 * We will cache window object in order to be able to provide parent shell
	 * for the message dialog.
	 * 
	 * @see IWorkbenchWindowActionDelegate#init
	 */
	@Override
	public void init(IWorkbenchWindow window) {
		this.window = window;
	}

	public boolean isCancel() {
		return isCancel;
	}
}